package com.wzy.wzyblog.service;

import com.wzy.wzyblog.dao.CommentRepository;
import com.wzy.wzyblog.po.Comment;
import net.bytebuddy.TypeCache;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CommentServiceImpl implements CommentService{

    @Autowired
    private CommentRepository commentRepository;

//获取列表
    @Override
    public List<Comment> listCommentByBlogId(Long blogId) {
//        根据时间排序
        Sort sort=Sort.by("createTime");
//        查询评论集合  所有顶级的数据（父级）
        List<Comment> comments = commentRepository.findByBlogIdAndParentCommentNull(blogId,sort);
        return eachComment(comments);
    }

//    保存
    @Transactional
    @Override
    public Comment saveComment(Comment comment) {
//                                     获取父类的id
        Long parentCommentId = comment.getParentComment().getId();
//        初始给一个-1值进行判断是否有父级
        if (parentCommentId != -1) {
//          把父级id放入建立上下级关系                     找到父级id
            comment.setParentComment(commentRepository.findById(parentCommentId).orElse(null));
        } else {
// 否则为平常的保存        把实例化的对象去掉 否则会报错
            comment.setParentComment(null);
        }
//        初始化数据时间
        comment.setCreateTime(new Date());
//        保存
        return commentRepository.save(comment);
    }



    /**
     * 循环每个顶级的评论节点
     * @param comments
     * @return
     */
    private List<Comment> eachComment(List<Comment> comments) {
//        创建新的集合 然后复制一份 避免修改原来的数据
        List<Comment> commentsView = new ArrayList<>();
        for (Comment comment : comments) {
            Comment c = new Comment();
            BeanUtils.copyProperties(comment,c);
            commentsView.add(c);
        }
        //合并评论的各层子代到第一级子代集合中
        combineChildren(commentsView);
        return commentsView;
    }

    /**
     *
     * @param comments root根节点，blog不为空的对象集合
     * @return
     */
    private void combineChildren(List<Comment> comments) {

        for (Comment comment : comments) {
            List<Comment> replys1 = comment.getReplyComments();
            for(Comment reply1 : replys1) {
                //循环迭代，找出子代，存放在tempReplys中
                recursively(reply1);
            }
            //修改顶级节点的reply集合为迭代处理后的集合
            comment.setReplyComments(tempReplys);
            //清除临时存放区
            tempReplys = new ArrayList<>();
        }
    }


    //存放迭代找出的所有子代的集合
    private List<Comment> tempReplys = new ArrayList<>();



    /**
     * 递归迭代，剥洋葱
     * @param comment 被迭代的对象
     * @return
     */
        private void recursively(Comment comment) {
            tempReplys.add(comment);//顶节点添加到临时存放集合
            if (comment.getReplyComments().size()>0) {
                List<Comment> replys = comment.getReplyComments();
                for (Comment reply : replys) {
                    if (reply.getReplyComments().size()>0) {
                        recursively(reply);
                    }else if(reply.getReplyComments().size() ==0){
                        tempReplys.add(reply);
                    }
                }
            }
        }

}
